export default class Sinusoid {



    /**
     * @param A 振幅
      * @param l 波长
      * @param w 角速度，1秒波能走多少波长，2PI表示1秒能走完一个完成的波长
      * @param t 时间
      * @param o 初相位，单位弧度，如果是PI/2,则往右偏移1/4波长
      * @param d y的偏移量
     */
    constructor(
        public A = 50, public l = 1, public w = 2 * Math.PI, public t = 0, public o = 0, public d = 0) { }

    /**
      * @param x x坐标
      */
    getY(x: number) {
        let { A, l, w, t, o, d } = this;
        // y= A * sin(2pix/l-wt-o)+D
        return A * Math.sin(2 * Math.PI * x / l - w * t - o) + d;
    }

    /**
     * 更改角速度
     * @param offset 增加/减少的值
     */
    changeW(offset: number) {
        this.o += this.w * this.t;
        this.t = 0;
        this.w += offset;
    }

    /**
     * 改变波长
     * @param offset 增加/减少的值
     */
    changeL(offset: number) {
        this.l = Math.max(0, this.l + offset);
    }
}